/*
 * Method.h
 *
 *   Created on: 2010-03-24
 *  Description: 
 *    Copyright: 2010 @ ICT Li Heyuan
 */

#ifndef METHOD_H_
#define METHOD_H_

#include "../json_cpp/value.h"
using Json::Value;

#include "../net/Network.h"
#include "../net/EasyAddr.h"
#include "../crypto/AESTools.h"

#include <string>
#include <set>
using std::string;
using std::set;

class RpcMethod
{

public:

	/* 构造方法
	 */
	RpcMethod();

	/* 析构函数
	 */
	virtual ~RpcMethod();

	/* 给外部调用的rpc接口
	 * @param param
	 * @param result rpc方法的执行结果
	 * @param error 出错信息
	 */
	bool execute(Value &req, Value &resp, EasyAddr &addr, string& error);

	/* 设置该方法是否启用RSA+AES加密
	 * @param encrypt，如果启用传入true，否则false（Method构造时默认false）
	 */
	void setEncrypt(bool encrypt);

protected:

	/* 需要用户实现的业务逻辑
	 * @param param rpc函数执行的参数
	 * @param result 逻辑返回结果
	 * @param addr Client的地址
	 * @param error 错误信息，留给逻辑使用
	 * @return 如果返回true,result返回给client;返回false则error返回给client
	 */
	virtual bool execute_logic(Value &param, Value& result,
			const EasyAddr &addr, string &error)=0;

	/* 检查IP是否通过白名单和黑名单测试，黑名单优先级高于白名单
	 * @param addr 待检查的地址
	 * @return 如果通过测试，表示允许访问,true;如果没有通过测试，表示不允许访问,false
	 */
	virtual bool checkIP(const EasyAddr &addr);

	/* 执行rpc逻辑前，对params自动解密
	 * @param req Json-RPC请求
	 * @param key AES的key，防止重复计算
	 * @param key AES的iv，防止重复计算
	 * @return 如果解密成功(或者不需要解密)返回true，否则返回false
	 */
	virtual bool autoDecrypt(Value &req, const string &ip, AESTools &aes);

	/* 执行rpc逻辑后，对result自动加密(如果result不为null)
	 * @param resp Json-RPC结果串，未加密
	 * @param key AES的key
	 * @param iv AES的iv
	 * @return 如果解密成功(或者不需要解密)返回true，否则返回false
	 */
	virtual bool autoEncrypt(Value &resp, AESTools &aes);

protected:

	//是否需要RSA+AES加密
	bool _isEncrypt;

	//定义rpc方法的参数和返回数值，格式b:ii
	string _paramSign;

	//IP白名单
	set<string> _whiteList;

	//IP黑名单
	set<string> _blackList;

};

#endif /* METHOD_H_ */
